<?php

/*现在需求是这样的。
每个网页都可以以图片或文本的形式返回
用户返回选择有html方式和json方式(比如header是json就返回json格式)
返回的类型有pic和text两种形式，访问不同接口返回不同格式*/


/*抽象出来的接口  render渲染 因为每个类都有这个函数，所以抽象到接口来*/
interface MediaInterface {
    public function render();
}

/*抽象出两个类， 图片类 和 文本类，因为两个类的属性不一样，图片有存放路径和图片名称，文本只有文字。(某些情况是可以不用抽象这一层的)*/
//图片抽象类
abstract class AbstractPicture implements MediaInterface {
    protected $path;
    protected $name;
    public function __construct($path, $name = '') {
        $this->name = (string) $name;
        $this->path = (string) $path;
    }
}
//文本抽象类
abstract class AbstractText implements MediaInterface {
    protected $text;
    public function __construct($text) {
        $this->text = (string) $text;
    }
}

//用4个类实现图片和文本  分别是 JsonPicture JsonText HtmlPicture HtmlText
//json图片输出类
class JsonPicture extends AbstractPicture{
    public function render(){//以json格式返回图片的名称和路径
        return json_encode(array('title' => $this->name, 'path' => $this->path));
    }
}

//json文本输出类
class JsonText extends AbstractText
{

    public function render()//以json格式返回文本
    {
        return json_encode(array('content' => $this->text));
    }
}

//html图片渲染类
class HtmlPicture extends AbstractPicture
{
    public function render()//返回一个图片标签 <img src=xxx>
    {
        return sprintf('<img src="%s" title="%s"/>', $this->path, $this->name);
    }
}
//html文本渲染类
class HtmlText extends AbstractText
{
    public function render()//以html方式 返回一个纯文本
    {
        return '<div>' . htmlspecialchars($this->text) . '</div>';
    }
}

/*抽象工厂*/
abstract class AbstractFactory
{
    abstract public function createText($content);
    abstract public function createPicture($path, $name = '');
}

//json工厂
class JsonFactory extends AbstractFactory {
    public function createPicture($path, $name = '') {
        return new JsonPicture($path, $name);
    }

    public function createText($content) {
        return new JsonText($content);
    }
}

//html工厂
class HtmlFactory extends AbstractFactory{
    public function createPicture($path, $name = '') {
        return new HtmlPicture($path, $name);
    }

    public function createText($content) {
        return new HtmlText($content);
    }
}
